#include "slist.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 头信息结构体的创建
int slist_create(slist_t **s, int size, ft1 destroy)
{


    // 参数检查
    if (size <= 0 || NULL == destroy)
    {
        perror("argument lawless...");
        goto err0;
    }

    // 创建结构体
    *s = malloc(sizeof(slist_t));
    if (NULL == *s)
    {
        perror("*s malloc failed...");
        goto err0;
    }
    memset(*s, 0, sizeof(slist_t));

    // 初始化
    (*s)->count = 0;
    (*s)->my_destroy = destroy;
    (*s)->p = NULL;
    (*s)->size = size;



    return 0;
err0:
    return -1;
}

// 创建链表节点
static node_t *__node_create(slist_t *s, void *data)
{
    node_t *tmp = NULL;

    // 参数检查
    if (NULL == s || NULL == data)
    {
        perror("argument lawless...");
        goto err0;
    }

    // 创建节点
    tmp = malloc(sizeof(node_t));
    if (NULL == tmp)
    {
        perror("tmp malloc failed...");
        goto err0;
    }
    memset(tmp, 0, sizeof(node_t));

    // 创建变量
    tmp->data = malloc(s->size);
    if (NULL == tmp->data)
    {
        perror("tmp_data malloc failed...");
        goto err1;
    }
    memset(tmp->data, 0, s->size);

    // 赋值
    memcpy(tmp->data, data, s->size);
    tmp->next = NULL;

    s->count++;

    return tmp;



err1:
    free(tmp);
err0:
    return NULL;
}

// 尾插
int slist_append(slist_t *s, void *data)
{
    node_t *new_node = NULL;
    node_t *tmp = NULL;


    // 参数检查
    if (NULL == s || NULL == data)
    {
        perror("argument lawless...");
        goto err0;
    }

    // 创建节点
    new_node = __node_create(s, data);

    // 尾插
    tmp = s->p;

    if (NULL == tmp)
    {
        s->p = new_node;
    }
    else
    {
        while (NULL != tmp->next)
        {
            tmp = tmp->next;
        }
        tmp->next = new_node;
    }

    return 0;
err0:
    return -1;
}

// 头插
int slist_prepend(slist_t *s, void *data)
{
    node_t *new_node = NULL;


    // 参数检查
    if (NULL == s || NULL == data)
    {
        perror("argument lawless...");
        goto err0;
    }

    // 创建节点
    new_node = __node_create(s, data);

    // 头插
    new_node->next = s->p;
    s->p = new_node;




    return 0;
err0:
    return -1;
}


// 链表的遍历
int slist_traverse(slist_t *s, ft1 my_print)
{


    return 0;

err0:
    return -1;
}